'use strict'
// 编写用户相关的代码
const Controller = require('egg').Controller
const defaultAvatar = 'http://s.yezgea02.com/1615973940679/WeChat77d6d2ac093e247c361f0b8a7aeb6c2a.png'

class UserController extends Controller {
    // 注册
    async register() {
        const { ctx } = this
        const { username, password } = ctx.request.body//获取注册需要的参数

        if (!username || !password) {
            ctx.body = {
                code: 500,
                msg: '账号密码不能为空',
                data: null
            }
            return
        }

        //   验证数据库内是否已有该用户名
        const userInfo = await ctx.service.user.getUserByName(username)
        if (userInfo && userInfo.id) {
            ctx.body = {
                code: 500,
                msg: '账户名已被注册，请重新输入',
                data: null
            }
            return
        }

        // 调用service方法 将数据存入数据库 用户注册
        const result = await ctx.service.user.register({
            username,//键值对
            password,
            signature: '世界和平',
            avatar: defaultAvatar,//头像
            ctime: Date.now(),
        })
        if (result) {
            ctx.body = {
                code: 200,
                msg: '注册成功',
                data: null
            }
        } else {
            ctx.body = {
                code: 500,
                msg: '注册失败',
                data: null
            }
        }
    }

    // 登录
    async login() {
        // app 为全局属性，相当于所有的插件方法都植入到了 app 对象。
        const { ctx, app } = this;
        const { username, password } = ctx.request.body
        // 根据用户名，在数据库查找相对应的id操作
        const userInfo = await ctx.service.user.getUserByName(username)
        // 没找到说明没有该用户
        if (!userInfo || !userInfo.id) {
            ctx.body = {
                code: 500,
                msg: '账号不存在',
                data: null
            }
            return
        }
        // 找到用户，并且判断输入密码与数据库中用户密码。
        if (userInfo && password != userInfo.password) {
            ctx.body = {
                code: 500,
                msg: '账号密码错误',
                data: null
            }
            return
        }

        // 生成 token 加盐
        // app.jwt.sign 方法接受两个参数，第一个为对象，对象内是需要加密的内容；第二个是加密字符串，上文已经提到过。
        const token = app.jwt.sign({
            id: userInfo.id,
            username: userInfo.username,
            exp: Math.floor(Date.now() / 1000) + (24 * 60 * 60) // token 有效期为 24 小时
        }, app.config.jwt.secret)
        //  我们把获取到的 userInfo 中的 id 和 username 两个属性，通过 app.jwt.sign 方法，结合 app.config.jwt.secret 加密字符串（之前声明的 Nick），生成一个 token。这个 token 会是一串很长的加密字符串，类似这样 dkadaklsfnasalkd9a9883kndlas9dfa9238jand 的一串密文。

        ctx.body = {
            code: 200,
            message: '登录成功',
            data: {
                token
            },
        };
    }

    // 验证方法
    /*我们发起请求的时候，通过在请求头 header 上，携带认证信息，让服务端可以通过
     ctx.request.header.authorization获取到 token，并解析出内容返回到客户端，
    */
    async test() {
        const { ctx, app } = this
        // 通过token解析，拿到user_id
        const token = ctx.request.header.authorization
        // 通过app.jwt.verify+加密字符串 解析出token的值
        const decode = await app.jwt.verify(token, app.config.jwt.secret)
        // 响应接口
        ctx.body = {
            code: 200,
            message: '获取成功',
            data: {
                ...decode
            }
        }

    }

    // 获取用户信息
    async getUserInfo() {
        const { ctx, app } = this
        const token = ctx.request.header.authorization
        // 通过 app.jwt.verify 方法，解析出 token 内的用户信息
        const decode = await app.jwt.verify(token, app.config.jwt.secret)
        
        //  通过 getUserByName 方法，以用户名 decode.username 为参数，从数据库获取到该用户名下的相关信息
        const userInfo = await ctx.service.user.getUserByName(decode.username)
        
        // userInfo 中应该有密码信息，所以我们指定下面四项返回给客户端
        ctx.body = {
            code: 200,
            msg: '请求成功',
            data: {
                id: userInfo.id,
                username: userInfo.username,
                signature: userInfo.signature || '',
                avatar: userInfo.avatar || defaultAvatar
            }
        }
    }
     // 修改个签
     async editUserInfo(){
      const {ctx,app}=this
    //   通过post请求，在请求体中获取签名字段signature 
    const {signature='',avatar=''}=ctx.request.body
    try{
        let user_id
        const token=ctx.request.header.authorization
        // 解密token中的用户名称
        const decode= await app.jwt.verify(token,app.config.jwt.secret)
        console.log(decode,'---decode');
        if(!decode)return
        user_id=decode.id

        // 通过username找到userInfo完整信息 客户端填写的内容
        const userInfo=await ctx.service.user.getUserByName(decode.username)
        console.log(userInfo,'---userInfo');

        // 通过service方法editUserInfo修改siganature信息
        const result=await ctx.service.user.editUserInfo({
            ...userInfo,
            signature,
            avatar
        })
        
        ctx.body={
            code: 200,
      msg: '请求成功',
      data: {
        id: user_id,
        signature,
        username: userInfo.username,
        avatar
      }
        }
    }catch(err){

    }

        
     }
}
module.exports = UserController